import Axios from 'axios'
import ErrorEnum from '@/config/error.enum.js'
// import API from './api.js'
import RootVue from '@/main.js'

const instance = Axios.create({
  baseURL: 'https://comei.10maker.com'
  // baseURL: 'http://localhost:8080'
})

// 请求筛选
instance.interceptors.request.use((config) => {
  const axiosConfig = config
  let { url } = axiosConfig
  const needBlobHeaderArr = ['exportExcel', 'getCaptchaImage']

  if (url.indexOf('login') === -1) { // 非登录接口
    const accessToken = window.sessionStorage.getItem('accessToken')
    const refreshToken = window.sessionStorage.getItem('refreshToken')
    axiosConfig.headers['Access-Token'] = accessToken
    axiosConfig.headers['Refresh-Token'] = refreshToken
    needBlobHeaderArr.forEach(item => {
      if (url.indexOf(item) !== -1) { // 导出Excel文件
        axiosConfig.responseType = 'blob'
      }
    })
  }

  url += '.htm'
  axiosConfig.url = url

  return axiosConfig
}, (error) => {
  RootVue.$message.error('请求失败，请检查网络')
  console.error(error)
  return Promise.resolve(error)
})

// 响应筛选
instance.interceptors.response.use(async (response) => {
  const { data, status } = response
  if (status !== 200) {
    switch (status) {
      case 400:
        RootVue.$message.error('错误请求')
        return Promise.reject(new Error('错误请求'))
      case 401:
        RootVue.$message.error('未授权，请重新登录')
        return Promise.reject(new Error('未授权，请重新登录'))
      case 403:
        RootVue.$message.error('拒绝访问')
        return Promise.reject(new Error('拒绝访问'))
      case 404:
        RootVue.$message.error('请求错误，未找到该资源')
        return Promise.reject(new Error('请求错误，未找到该资源'))
      case 405:
        RootVue.$message.error('请求方法未经允许')
        return Promise.reject(new Error('请求方法未经允许'))
      case 408:
        RootVue.$message.error('请求超时')
        return Promise.reject(new Error('请求超时'))
      case 500:
        RootVue.$message.error('服务器出错')
        return Promise.reject(new Error('服务器出错'))
      case 501:
        RootVue.$message.error('网络未实现')
        return Promise.reject(new Error('网络未实现'))
      case 502:
        RootVue.$message.error('网络错误')
        return Promise.reject(new Error('网络错误'))
      case 503:
        RootVue.$message.error('服务不可用')
        return Promise.reject(new Error('服务不可用'))
      case 504:
        RootVue.$message.error('网络超时')
        return Promise.reject(new Error('网络超时'))
      case 505:
        RootVue.$message.error('HTTP版本不支持该请求')
        return Promise.reject(new Error('HTTP版本不支持该请求'))
      default:
        RootVue.$message.error(`连接错误，错误码：${status}`)
        return Promise.reject(new Error(`连接错误，错误码：${status}`))
    }
  }
  const { code } = data
  if (code !== 1 && code !== undefined) {
    // message.error(Codes[code]);
    if (code === ErrorEnum.TOKEN_ERROR) {
      RootVue.$router.push({ name: 'Login' })
    }
    if (code === ErrorEnum.TOKEN_INVALID) {
      // const res = await API.updateAccessToken()
      // const { code, data } = res
      // if (code === 1) {
      //   console.log(data)
      //   window.localStorage.setItem('accessToken', data)
      // }
      RootVue.$router.push({ name: 'Login' })
    }
  }
  return data
}, (error) => {
  RootVue.$message.error('请求出错')
  console.log(error)
  return Promise.resolve(Error)
})

export default instance
